#ifndef VIDEOMONITORWINDOW_H
#define VIDEOMONITORWINDOW_H

#include "Login.h"
#include "Register.h"
#include "tcpclient.h"
#include "FFmpegKits.h"
#include "VideoStructs.h"
#include <QDebug>
#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QListWidget>
#include <QTreeWidget>
#include <QSlider>
#include <QTimer>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QDateTime>
#include <QTabWidget>
#include <QTreeWidgetItem>
#include <QMouseEvent>
#include <QStackedWidget>
#include <QLineEdit>
#include <QMap>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QUrlQuery>
#include <QTextEdit>
#include <QByteArray>
#include <QNetworkReply>

class VideoMonitorWindow : public QMainWindow
{
    Q_OBJECT

public:
    VideoMonitorWindow(QWidget *parent = nullptr);
    ~VideoMonitorWindow();

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseDoubleClickEvent(QMouseEvent *event) override;

private slots:
    // 处理登录第一步结果（获取salt）
    void onLoginStep1Result(bool success, const QString &msg, const QString &salt);
    // 处理登录第二步结果（服务器验证）
    void onLoginStep2Result(bool success, const QString &msg);
    // 处理注册第一步结果（获取Salt）
    void onRegisterStep1Result(bool success, const QString &msg, const QString &salt);
    // 处理注册第二步结果（提交加密密码）
    void onRegisterStep2Result(bool success, const QString &msg);
    // 处理向服务器请求摄像头RTMP地址
    void onStreamUrlReceived(int cameraId, bool isMainStream, const QString &url);
    // 处理向服务器请求摄像头PTZ
    void onPTZControlResult(bool success, const QString &msg);

    void onMetadataReceived(const VideoMetadata& metadata);

    void onVideoFrameReceived(const VideoFrame& frame);

    FFmpegKits* getPlayerByCameraId(int cameraId);
    void updateTime();                  // 更新时间的槽函数
    // 注册相关槽函数
    void handleRegisterRequest(const QString &username, const QString &password);
    void handleLoginRequest(const QString &username, const QString &password);
    void switchToLoginInterface();
    void switchToRegisterInterface();
    // 新增：设置点动时间
    void setPTZDuration(int duration);
    void handlePTZCommand(const QString &command); // 处理云台控制命令
    void stopPTZMovement(); // 停止云台运动

private:
    void initUI();
    void initMonitorInterface();        // 初始化监控主界面
    void initVideoPlayers();            // 初始化视频播放器
    void setupPTZConnections();         // 设置云台控制连接
    //void startVideoPlayback(int channel, bool isMainStream); // 启动视频播放
    void stopVideoPlayback(int channel); // 停止视频播放
    void sendPTZCommand(const QString &command); // 发送云台控制命令
    QString generateToken(const QMap<QString, QString> &params); // 生成Token
    void requestRecordList(int channel, qint64 beginTime, qint64 endTime); // 请求录像列表
    void onDeviceItemDoubleClicked(QTreeWidgetItem *item, int column);
    void addLogMessage(const QString &message); // 添加日志消息

    // 新增：TCP客户端实例
    tcpclient *m_tcpClient;
    QString m_tempLoginUsername;    // 临时保存登录的用户名
    QString m_tempLoginPassword;    // 临时保存登录的原始密码
    // 临时保存注册过程中的用户名和原始密码（用于第二步加密）
    QString m_tempRegisterUsername;
    QString m_tempRegisterPassword;

    // 界面切换核心组件
    QStackedWidget *m_stackedWidget;    // 管理登录、注册、监控三大界面
    Login *m_loginWidget;               // 登录界面实例
    Register *m_registerWidget;         // 注册界面实例
    QWidget *m_monitorContainer;

    // ==================== 监控主界面组件（原组件保留） ====================
    QWidget *m_topWidget;
    QLabel *m_titleLabel;
    QPushButton *m_btnVideoMonitor;
    QPushButton *m_btnVideoPlayback;
    QPushButton *m_btnElectronicMap;
    QPushButton *m_btnSystemSetting;
    QPushButton *m_btnLogQuery;
    QLabel *m_timeLabel;
    QTimer *m_timer;

    QWidget *m_leftWidget;
    QTabWidget *m_leftTabWidget;
    QWidget *m_windowInfoWidget;
    QWidget *m_graphicAlarmWidget;
    QListWidget *m_graphicAlarmList;

    QWidget *m_centralWidget;
    QGridLayout *m_channelLayout;
    QWidget *m_channel1, *m_channel2, *m_channel3, *m_channel4;
    QLabel *m_channel1Label, *m_channel2Label, *m_channel3Label, *m_channel4Label;

    QWidget *m_rightWidget;
    QWidget *m_deviceListWidget;
    QTreeWidget *m_deviceTree;
    QWidget *m_ptzControlWidget;
    QPushButton *m_btnUp, *m_btnDown, *m_btnLeft, *m_btnRight, *m_btnCenter;
    QPushButton *m_btnLon, *m_btnLup, *m_btnRon, *m_btnRup;
    QPushButton *m_btnZoomIn, *m_btnZoomOut;
    QPushButton *m_btnFocusIn, *m_btnFocusOut;
    QPushButton *m_btnIrisIn, *m_btnIrisOut;
    QSlider *m_stepSlider;
    QLabel *m_stepLabel;
    QTextEdit *m_logTextEdit; // 用于显示日志的文本编辑框
    QPoint m_dragPosition;

    // 模拟用户数据存储（用户名->密码，实际项目需加密并对接数据库）
    static QMap<QString, QString> m_userDB;

    QTimer *m_ptzStopTimer; // 云台停止计时器
    QString m_lastPTZCommand; // 最后发送的PTZ命令
    int m_ptzDuration; // 点动持续时间(毫秒)
    QLabel *m_ptzDurationLabel; // 显示点动时间的标签
    QSlider *m_ptzDurationSlider; // 调整点动时间的滑块

    // 新增：FFmpeg视频播放器实例
    FFmpegKits *m_ffmpeg1=nullptr; // 通道一主码流
    FFmpegKits *m_ffmpeg2=nullptr; // 通道一子码流
    FFmpegKits *m_ffmpeg3=nullptr; // 通道二主码流
    FFmpegKits *m_ffmpeg4=nullptr; // 通道二子码流
    FFmpegKits *m_ffmpeg5=nullptr; // 通道三主码流
    FFmpegKits *m_ffmpeg6=nullptr; // 通道三子码流
    FFmpegKits *m_ffmpeg7=nullptr; // 通道四主码流
    FFmpegKits *m_ffmpeg8=nullptr; // 通道四子码流

    // 新增：视频显示标签
    QLabel *m_videoLabel1;
    QLabel *m_videoLabel2;
    QLabel *m_videoLabel3;
    QLabel *m_videoLabel4;

    //不同摄像头的RTMP
//    QString m_camera1MainRTMP;
//    QString m_camera1SubRTMP;
//    QString m_camera2MainRTMP;
//    QString m_camera2SubRTMP;
    // 添加用于存储从服务器获取的RTMP地址的映射
    QMap<QString, QString> m_cameraStreams;

    // 新增：云台控制相关
    QNetworkAccessManager *m_networkManager;
    //    QString m_cameraIp1;
    //    QString m_cameraIp2;
    //    int m_cameraPort;
    //    QString m_secretKey;

    // 新增：当前选中的通道
    int m_currentChannel;
    //云台控制定时器
    QTimer *m_ptzTimer;

};

#endif // VIDEOMONITORWINDOW_H
